#pragma once

#include <cstdio>
#include <iostream>
#include <cstring>
#include <sys/types.h>
#include <unistd.h>
#include <cstdarg>
#include <time.h>

const std::string filename = "tcpserver.log";

// 日志等级
enum
{
    Debug = 0,
    Info,
    Warning,
    Error,
    Fatal,
    Uknown
};
std::string toLevelString(int level)
{
    switch (level)
    {
    case 0:
        return "Debug";
    case 1:
        return "Info";
    case 2:
        return "Warning";
    case 3:
        return "Error";
    case 4:
        return "Fatal";
    case 5:
        return "Uknown";
    default:
        return "Uknown";
    }
}

// struct tm
// {
//   int tm_sec;			/* Seconds.	[0-60] (1 leap second) */
//   int tm_min;			/* Minutes.	[0-59] */
//   int tm_hour;			/* Hours.	[0-23] */
//   int tm_mday;			/* Day.		[1-31] */
//   int tm_mon;			/* Month.	[0-11] */
//   int tm_year;			/* Year	- 1900.  */
//   int tm_wday;			/* Day of week.	[0-6] */
//   int tm_yday;			/* Days in year.[0-365]	*/
//   int tm_isdst;			/* DST.		[-1/0/1]*/
// };

std::string toTime()
{
    time_t curr = time(0);
    struct tm *tmp = localtime(&curr);
    char buffer[1024];
    snprintf(buffer, sizeof(buffer), "%d年%d月%d日 %d:%d:%d", 
            tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
    return buffer;
}

// 日志格式: 日志等级 时间 pid 消息体
void logMessage(int level, const char *fromat, ...)
{
    char logleft[1024];
    std::string level_str = toLevelString(level);
    std::string curr_time = toTime();
    snprintf(logleft, sizeof(logleft), "[%s] [%s] [pid:%d] ", level_str.c_str(), curr_time.c_str(), getpid());

    char logright[1024];
    va_list p;
    va_start(p, fromat);
    vsnprintf(logright, sizeof(logright), fromat, p);
    va_end(p);
    // 打印
    printf("%s%s\n", logleft, logright);
    //守护进程化之后，再向显示器打印数据都会被重定向到null文件中去，因此我们应该采用更好的方式--向文件中打印日志
    
    // FILE* fp = fopen(filename.c_str(), "a");
    // if(fp == NULL)
    // {
    //     return;
    // }
    // fprintf(fp, "%s%s\n", logleft, logright);
    // fflush(fp);
    // fclose(fp);//关闭文件的时候也会刷新缓冲区

    // 预备
    //  va_list p; // char *
    //  int a = va_arg(p, int);  // 根据类型提取参数
    //  va_start(p, format); //p指向可变参数部分的起始地址
    //  va_end(p); // p = NULL;
}